﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EWS_Messgenerator
{
    class Generator
    {   
        //Statische Parameter von Hannes Kollmer festgelegt
        //uint puls = 70;
        //uint blutDruck = 140;
        //uint atemFrequ = 15;
        //uint sauerstoffsättigung = 95;
        //double Temp = 36.7;




//P U L S

        public uint getPuls(uint value, Random generateNumber)
        {
            uint puls = 70;


            switch (value)//value entscheidet in welchen Zustand Patient übergeht
            {

                //geht in gelben Zustand über
                case 1:
                    {
                        puls = (uint)(puls * 1.6 + generateNumber.Next(1, 11));//70*1.5 = 112, generateNumber.Next(1,11) generiert Zufallszahl zwischen 1 und 10,,,, ergibt Wert das es scorepunkt 2 gibt
                    } break;


                //geht in orangenen Zustand über
                case 2:
                    {
                        puls = (uint)((puls - 29) + generateNumber.Next(2, 9));//puls - 29 = 41 + Wert zwischen 1 und 8,,,, ergibt Wert das es scorepunkt 1 gibt
                    } break;


                //geht in roten Zustand über
                case 3:
                    {
                        puls = (uint)((puls - 60) + generateNumber.Next(2, 29));//70-60=10 + Wert zwischen 1 und 28,,,, ergibt Wert das es scorepunkt 2 gibt
                    } break;

            }

            return puls;
        }






//B L U T D R U C K


        
        public uint getBlutdruck(uint value, Random generateNumber)
        {
            uint blutDruck = 140;


            switch (value)//value entscheidet in welchen Zustand Patient übergeht
            {

                //geht in gelben Zustand über
                case 1:
                    {
                        blutDruck = (uint)(blutDruck + generateNumber.Next(2, 56));//140 + Wert zwischen 1 und 55, bleibt im positiven Bereich
                    } break;


                //geht in orangenen Zustand über
                case 2:
                    {
                        blutDruck = (uint)((blutDruck - 59) + generateNumber.Next(2, 19));//140-59=81 + Wert zwischen 1 und 19,,,, ergibt Wert das es scorepunkt 1 gibt
                    } break;


                //geht in roten Zustand über
                case 3:
                    {
                        blutDruck = (uint)((blutDruck - 120) + generateNumber.Next(2, 49));//140-120=20 + Wert zwischen 1 und 48,,,, ergibt Wert das es scorepunkt 3 gibt
                    } break;

            }

            return blutDruck;
        }



//A T E M F R E Q U E N Z

        
            
            
        public uint getAtemfrequenz(uint value, Random generateNumber)
        {
            uint atemFrequ = 15;


            switch (value)//value entscheidet in welchen Zustand Patient übergeht
            {

                //geht in gelben Zustand über
                case 1:
                    {
                        atemFrequ = (uint)(atemFrequ + generateNumber.Next(2, 10));//15 + Wert zwischen 1 und 9, bleibt im positiven Bereich
                    } break;


                //geht in orangenen Zustand über
                case 2:
                    {
                        atemFrequ = (uint)((atemFrequ - 15) + generateNumber.Next(2, 8));//15-15=0 + Wert zwischen 1 und 7,,,, ergibt Wert das es scorepunkt 2 gibt
                    } break;


                //geht in roten Zustand über
                case 3:
                    {
                        atemFrequ = (uint)((atemFrequ - 15) + generateNumber.Next(2, 8));//15-15=0 + Wert zwischen 1 und 7,,,, ergibt Wert das es scorepunkt 2 gibt
                    } break;

            }

            return atemFrequ;
        }



//S A U E R S T O F F S A E T T I N G


        public uint getSauerstoffsaettigung(uint value, Random generateNumber)
        {
            uint sauerstoffsättigung = 95;


            switch (value)//value entscheidet in welchen Zustand Patient übergeht
            {

                //geht in gelben Zustand über
                case 1:
                    {
                        sauerstoffsättigung = (uint)((sauerstoffsättigung - 5) + generateNumber.Next(2, 4));//ergibt Wert das es scorepunkt 1 gibt
                    } break;


                //geht in orangenen Zustand über
                case 2:
                    {
                        sauerstoffsättigung = (uint)((sauerstoffsättigung - 5) + generateNumber.Next(2, 4));//ergibt Wert das es scorepunkt 1 gibt
                    } break;


                //geht in roten Zustand über
                case 3:
                    {
                        sauerstoffsättigung = (uint)((sauerstoffsättigung - 55) + generateNumber.Next(2, 46));//95-55=40 + Wert zwischen 1 und 45
                    } break;

            }

            return sauerstoffsättigung;
        }





//T E M P E R A T U R


        public double getTemperatur(uint value, Random generateNumber)
        {
            double Temp = 36.7;
            
            
            switch (value)//value entscheidet in welchen Zustand Patient übergeht
            {

                //geht in gelben Zustand über
                case 1:
                {
                    Temp = Math.Round(Temp + (generateNumber.NextDouble() - 0.5), 2);
                } break;


                //geht in orangenen Zustand über
                case 2:
                {
                    Temp = Math.Round(Temp + ((generateNumber.NextDouble() - 0.5) - (generateNumber.NextDouble() - 0.5) % 0.1), 2);
                } break;


                //geht in roten Zustand über
                case 3:
                {
                    Temp = Math.Round(((Temp + 2) + generateNumber.Next(2, 6)), 2);//36.7 + 2 = 38.7 + Wert zwischen 1 und 5,,,, ergibt Wert das es scorepunkt 2 gibt
                } break;
   
            }

            return Temp;
        }




        

        // übergibt dem Dataobj die Parameter
        public PatientData create(Random generateNumber, uint reglerValuePuls, uint reglerValueBlutdruck, uint reglerValueAtemfrequ, uint reglerValueSauerstoffsaettigung, uint reglerValueTemp)
        {

            

            PatientData Data = new PatientData();
            Data.Puls = getPuls(reglerValuePuls, generateNumber);
            Data.Blutdruck = getBlutdruck(reglerValueBlutdruck, generateNumber);
            Data.Atemfrequenz = getAtemfrequenz(reglerValueAtemfrequ, generateNumber);
            Data.Sauerstoffsaettigung = getSauerstoffsaettigung(reglerValueSauerstoffsaettigung, generateNumber);
            Data.Temperatur = getTemperatur(reglerValueTemp, generateNumber);
            Data.timestamp = DateTime.Now;
/*            
            //Werte sind jetz mit Standardwerten initialisiert, heißt Zustand ist grün
            Data.Puls = (uint)(puls + (generateNumber.Next(1, 11)-5));
            Data.Blutdruck = (uint)(blutDruck + generateNumber.Next(2, 56)-27);
            Data.Atemfrequenz = (uint)(atemFrequ + generateNumber.Next(2, 10)-4);
            Data.Sauerstoffsaettigung = sauerstoffsättigung;
            Data.Temperatur = Math.Round(Temp + (generateNumber.NextDouble() - 0.5),2);
            


            
            switch (value)//value entscheidet in welchen Zustand Patient übergeht
            {


                //geht in gelben Zustand über
                case 1:
                    {
                        Data.Puls = (uint)(puls * 1.6 + generateNumber.Next(1, 11));//70*1.5 = 112, generateNumber.Next(1,11) generiert Zufallszahl zwischen 1 und 10,,,, ergibt Wert das es scorepunkt 2 gibt
                        Data.Blutdruck = (uint)(blutDruck + generateNumber.Next(2, 56));//140 + Wert zwischen 1 und 55, bleibt im positiven Bereich
                        Data.Atemfrequenz = (uint)(atemFrequ + generateNumber.Next(2, 10));//15 + Wert zwischen 1 und 9, bleibt im positiven Bereich
                        Data.Sauerstoffsaettigung = (uint)((sauerstoffsättigung - 5) + generateNumber.Next(2, 4));//ergibt Wert das es scorepunkt 1 gibt
                        Data.Temperatur = Math.Round(Temp + (generateNumber.NextDouble()-0.5),2) ;
                    } break;


                //geht in orangenen Zustand über
                case 2:
                    {
                        Data.Puls = (uint)((puls - 29) + generateNumber.Next(2, 9));//puls - 29 = 41 + Wert zwischen 1 und 8,,,, ergibt Wert das es scorepunkt 1 gibt
                        Data.Blutdruck = (uint)((blutDruck - 59) + generateNumber.Next(2, 19));//140-59=81 + Wert zwischen 1 und 19,,,, ergibt Wert das es scorepunkt 1 gibt
                        Data.Atemfrequenz = (uint)((atemFrequ - 15) + generateNumber.Next(2, 8));//15-15=0 + Wert zwischen 1 und 7,,,, ergibt Wert das es scorepunkt 2 gibt
                        Data.Sauerstoffsaettigung = (uint)((sauerstoffsättigung - 5) + generateNumber.Next(2, 4));//ergibt Wert das es scorepunkt 1 gibt
                        Data.Temperatur = Math.Round(Temp + ((generateNumber.NextDouble() - 0.5) - (generateNumber.NextDouble() - 0.5)%0.1),2);
                    } break;


                //geht in roten Zustand über
                case 3:
                    {
                        Data.Puls = (uint)((puls - 60) + generateNumber.Next(2, 29));//70-60=10 + Wert zwischen 1 und 28,,,, ergibt Wert das es scorepunkt 2 gibt
                        Data.Blutdruck = (uint)((blutDruck - 120) + generateNumber.Next(2, 49));//140-120=20 + Wert zwischen 1 und 48,,,, ergibt Wert das es scorepunkt 3 gibt
                        Data.Atemfrequenz = (uint)((atemFrequ - 15) + generateNumber.Next(2, 8));//15-15=0 + Wert zwischen 1 und 7,,,, ergibt Wert das es scorepunkt 2 gibt
                        Data.Sauerstoffsaettigung = (uint)((sauerstoffsättigung - 55) + generateNumber.Next(2, 46));//95-55=40 + Wert zwischen 1 und 45
                        Data.Temperatur = Math.Round(((Temp + 2) + generateNumber.Next(2, 6)), 2);//36.7 + 2 = 38.7 + Wert zwischen 1 und 5,,,, ergibt Wert das es scorepunkt 2 gibt
                    } break;
            }

*/
            return Data;
        }
    }
}
